Lambda在LINQ扮演著十分重要的角色,為了要對每一筆資料做特定的處理,LINQ會使用委派來將外面的方法帶入巡覽的時候執行以得到期望的資料,而為求簡潔,LINQ帶入的委派常常是以Lambda的形式表示。
現在讓我來簡單介紹Lambda吧。
首先我們來看看委派的方式從以前到現在有哪些寫法,請參考下面的範例:
static string nameMethod(string output)
{
return output;
}
static void Main()
{
// Instantiate delegate with named method:
consoleWriteLine(nameMethod, "name method");
// Instantiate delegate with anonymous method:
consoleWriteLine(delegate (string output) { return output; }, "anonymous method");
// Instantiate delegate with lambda expression
consoleWriteLine(output => output, "lambda method");
}
//public delegate TResult Func<in T, out TResult>(T arg);
private static void consoleWriteLine(Func<string, string> stringGetter, stringinput)
{
Console.WriteLine(stringGetter(input));
}
上面的程式碼帶出以下的重點
consoleWriteLine
的第一個參數Func
的定義寫於上方註解,它其實是一個有input
及output
的委派nameMethod
)指給委派delegate (arguments) { statements }
arguments => expression | block
()
表示{}
,只能單行程式碼,代表回傳值{ statements }
: 程式碼區塊,statement
為此函式執行的程式碼片段在上面的範例說明有用文字描述了Lambda的格式規範,現在我們將每一個格式以例子的方式介紹,藉以加深印象。
格式: arguments => expression | block
arguments
()
//Only one input parameter
x => x * x //legal
(x) => x * x //legal
//Two or more input parameters
x, y => x * y //illegal
(x, y) => x * y //legal
()
,不明確指定型別也可以string x => x * x //illegal
(string x) => x * x //legal
x => x * x
()
表示() => Console.WriteLine("Hello Lambda")
expression
expression
,可以不用{}
包住程式,程式行的最後也不用加;
,其程式碼所代表的是回傳值x => x * x //delegate (int x) { return x * x; }
expression
格式的Lambda稱為Lambda運算式(Lambda Expressions)block
;
x => { return x * x; }
block
格式的Lambda稱為Lambda陳述式(Lambda Statements)這章我們學到了各種函式,具名函式、匿名函式及Lambda,從寫法上來觀察,一個比一個還要簡潔,需要撰寫的程式碼也越來越少,到了Lambda更是能省的都已經省了的地步,再次地體會到懶惰是人類進步的原動力
這樣的概念。